///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*	Contains code for segments.
*	\file		LaborSegment.h
*	\author		Pierre Terdiman
*	\date		April, 4, 2000
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Include Guard
#ifndef __LABORSEGMENT_H__
#define __LABORSEGMENT_H__
#include "LaborCoreDef.h"
NAMESPACE_LABOR3D_BEGIN
class  LABORCORE_API CLSegment
{
public:
	//! Constructor
	inline					CLSegment()															{}
	//! Constructor
	inline					CLSegment(const CLPoint& p0, const CLPoint& p1) : mP0(p0), mP1(p1)		{}
	//! Copy constructor
	inline					CLSegment(const CLSegment& seg) : mP0(seg.mP0), mP1(seg.mP1)			{}
	//! Destructor
	inline					~CLSegment()															{}

	inline	const	CLPoint&	getOrigin()						const	{ return mP0;						}
	inline			CLPoint	computeDirection()				const	{ return mP1 - mP0;					}
	inline			void	computeDirection(CLPoint& dir)	const	{ dir = mP1 - mP0;					}
	inline			float	computeLength()					const	{ return mP1.distance(mP0);			}
	inline			float	computeSquareLength()			const	{ return mP1.squareDistance(mP0);	}

	inline			void	setOriginDirection(const CLPoint& origin, const CLPoint& direction)
	{
		mP0 = mP1 = origin;
		mP1 += direction;
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/**
	*	Computes a point on the segment
	*	\param		pt	[out] point on segment
	*	\param		t	[in] point's parameter [t=0 => pt = mP0, t=1 => pt = mP1]
	*/
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	inline			void	computePoint(CLPoint& pt, float t)	const	{	pt = mP0 + t * (mP1 - mP0);		}

	float	squareDistance(const CLPoint& point, float* t=null)	const;
	inline			float	distance(const CLPoint& point, float* t=null)		const			{ return sqrtf(squareDistance(point, t));	}

	CLPoint	mP0;		//!< Start of segment
	CLPoint	mP1;		//!< End of segment


};

NAMESPACE_LABOR3D_END

#endif // __LABORSEGMENT_H__
